package com.njaccp.countword;

import java.io.*;
import java.net.URLDecoder;
import java.util.*;

public class App 
{
    /**
     * 1.创建输入流，读取文档；
     * 2.分隔文本为独立单词的表,存入总词表allWordList中；
     * 3.创建wordcounts表（HashMap），然后遍历总文的独立单词表，确认HashMap中是否已有key为该单词，若存在则跳过，若不存在则开启子线程进行计数。
     * 4.子线程对遍历总表，记录它处理的单词的次数并存到的wordcounts表中。
     * 5.主程序休眠等待子线程结束，输出HashMap表
     * @param args
     */
    public static void main(String[] args) {
        //1.创建输入流，读入文档
        File file=new File(".\\src\\main\\resources\\mycat.txt");
        FileReader fr= null;
        try {
            fr = new FileReader(file);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return; //文件不存在则主程序终止
        }
        BufferedReader br=new BufferedReader(fr);
        StringBuffer str=new StringBuffer();//使用BufferString类,避免在内存中生成过多的字符串
        String temp=null;
        try {
            while((temp=br.readLine())!=null)
            {
                str.append(temp);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                br.close();
                fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        String text = str.toString();//转存到String类

        //2.分隔文本为独立的单词表:allWordList
        ArrayList<String> allWordList=new ArrayList<>();
        for (String word:text.split(" |,|\\.")//. + * | 都是转义字符
             ) {
                allWordList.add(word);
        }

        //3.主程序开始处理总词表allWordList
        //创建记录单词出现次数的HashMap
        HashMap<String,Integer> wordCountMap =new HashMap<>();
        //开始处理总词表
        for (int i = 0; i <allWordList.size() ; i++) {
            //从总表中获得一个记录
            temp=allWordList.get(i);
            //如果已知词库表不包含该单词，将该单词加入到已知词库，然后开启新线程统计该词出现的频率
            if(!wordCountMap.containsKey(temp)){//由于存储的是String类，重写了.equals方法，故contains可以判断值是否重复
                wordCountMap.put(temp,0);//此处给出0先在Map中添加节点,避免线程冲突发生新结点间的相互覆盖。//也可以使用锁实现//
                Thread wordCountThread=new WordCountThread(allWordList,temp,wordCountMap);//给子线程总文本表/目标单词/单词次数图
                wordCountThread.start();
            }
            //如果已知词库已包含该单词则不做任何动作，代表已有线程统计该单词
        }

        //5.在其他线程运行完之前，主线程睡眠，等待用于统计的子线程全部结束后再输出结果
        try {
            while(Thread.activeCount()>2){
                Thread.sleep(0);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //输出词频情况
        System.out.println(wordCountMap.toString());
    }
}
